import DOMOperator from './DomOperator'
import utils from './utils'
/**
 * 音视频检测器类
 */
class MediaDetector {
  /**
   * 初始化检测器
   */
  constructor(bridge) {
    this.observer = null
    this.bridge = bridge
    this.mediaElements = new Map() // 存储媒体元素及其元数据
    this.domOperator = new DOMOperator(bridge) //动态生成转录按钮
    console.log('MediaDetector初始化')
  }

  /**
   * 开始监听页面DOM变化
   */
  startObserving() {
    if (this.observer) {
      return
    }

    // 创建 MutationObserver 实例
    console.log('开始监听页面DOM变化')
    this.observer = new MutationObserver((mutations) => {
      // 检查是否有新的媒体元素
      const hasNewMedia = mutations.some((mutation) => {
        // 检查新增的节点
        return Array.from(mutation.addedNodes).some((node) => {
          if (node.nodeType === Node.ELEMENT_NODE) {
            // 检查节点本身是否是媒体元素
            if (node.matches('video, audio')) {
              return true
            }
            // 检查节点内部是否包含媒体元素
            const mediaElements = node.querySelectorAll('video, audio')
            return mediaElements.length > 0
          }
          return false
        })
      })

      if (hasNewMedia) {
        console.log('检测到新的媒体元素')
        this.detectMediaElements()
      }
    })

    // 开始观察整个文档
    this.observer.observe(document.documentElement, {
      childList: true, // 观察子节点的添加或删除
      subtree: true, // 观察所有后代节点
      attributes: false, // 不观察属性变化
      characterData: false, // 不观察文本内容变化
    })

    // 初始检测
    console.log('执行初始检测')
    this.detectMediaElements()
  }

  /**
   * 停止监听页面DOM变化
   */
  stopObserving() {
    if (this.observer) {
      this.observer.disconnect()
      this.observer = null
    }
    // 清理缓存
    this.mediaElements.clear()
  }

  /**
   * 检测页面中的音视频元素
   * @returns {Array<MediaElement>} 媒体元素数组
   */
  detectMediaElements() {
    console.log('开始检测媒体元素')
    const mediaElements = document.querySelectorAll('video, audio')
    console.log('找到媒体元素数量:', mediaElements.length)

    // 更新现有元素状态
    for (const [element] of this.mediaElements) {
      if (!document.contains(element)) {
        // 元素已不存在，从缓存中移除
        console.log('元素被移除', element)
        this.mediaElements.delete(element)
      }
    }

    // 检测新元素
    mediaElements.forEach((element) => {
      if (!this.mediaElements.has(element)) {
        console.log('发现新的媒体元素:', element)
        this.mediaElements.set(element, utils.extractMetadata(element))
        this.domOperator.createTransactionButton(element)
      }
    })
  }

  /*
   * 根据src获取媒体元素
   * @param {string} src - 媒体元素的src
   * @returns {MediaElement} 媒体元素
   */
  getElementBySrc(src) {
    for (const [element, metadata] of this.mediaElements) {
      if (metadata.src === src) {
        return element
      }
    }
    return null
  }
}

export default MediaDetector
